package com.iocup.keybastion.authentication.userdetails;


import java.beans.Transient;
import java.io.Serializable;
import java.util.Map;
import java.util.Set;

/**
 * @Description: 认证账号接口信息
 * @Author: xyjxust
 * @Date: 2021/11/23 15:52
 */
public interface UserDetails extends Serializable {
    /**
     * 获取资源信息
     *
     * @return
     */
    Set<String> getResources();

    /**
     * 设置资源信息
     * @param resources
     */
    void setResources( Set<String> resources);



    /**
     * 获取角色信息
     *
     * @return
     */
    Set<String> getRoles();

    /**
     * 设置角色集合
     * @param roles
     */
    void setRoles( Set<String> roles);

    /**
     * 获取密码
     *
     * @return
     */
    @Transient
    String getPassword();

    /**
     * 设置密码
     * @param password
     */
    void setPassword(String password);

    /**
     * 获取账号
     *
     * @return
     */
    String getLoginName();

    /**
     * 设置账号
     * @param loginName
     */
    void setLoginName( String loginName);

    /**
     * 账号是否过期
     *
     * @return
     */
    @Transient
    boolean isAccountNonExpired();

    /**
     * 账号是否被锁定
     *
     * @return
     */
    @Transient
    boolean isAccountNonLocked();

    /**
     * 凭证是否失效
     *
     * @return
     */
    @Transient
    boolean isCredentialsNonExpired();

    /**
     * 账户是否已禁用
     *
     * @return
     */
    @Transient
    boolean isEnabled();

    /**
     * 获取id
     *
     * @return
     */
   <T> T getId();

    /**
     * 设置账号id
     * @param id
     * @param <T>
     */
    <T>  void setId( T id);

    /**
     * 获取用户姓名
     * @return
     */
    String getUserName();

    /**
     * 设置用户民
     * @param userName
     */
      void setUserName( String userName);

    /**
     * 获取其他信息
     *
     * @param key
     * @param <T>
     * @return
     */
    @Transient
    <T> T getOther(String key);

    /**
     *  设置其他信息
     * @param key
     * @param value
     * @return
     */
    UserDetails putOther(String key, Object value);

    @Transient
    Map<String,Object> getOthers();
}